package com.nep.common.service;

import com.nep.entity.supervisor.Report;
import com.nep.entity.supervisor.User;

import java.io.*;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

/**
 * 用户服务实现类
 * 提供用户认证、注册、信息更新以及环境报告管理等功能
 * 使用文件系统进行数据持久化存储
 */
public class UserServiceImpl implements UserService {
    private static final String USER_FILE_PATH = "users.txt";     // 用户数据存储文件路径
    private static final String REPORT_FILE_PATH = "reports.txt"; // 报告数据存储文件路径

    /**
     * 构造函数
     * 初始化时检查并创建数据文件（如果不存在）
     */
    public UserServiceImpl() {
        createFileIfNotExists(USER_FILE_PATH);
        createFileIfNotExists(REPORT_FILE_PATH);
    }

    /**
     * 检查并创建文件（如果不存在）
     * @param filePath 文件路径
     */
    private void createFileIfNotExists(String filePath) {
        Path path = Paths.get(filePath);
        try {
            if (!Files.exists(path)) {
                Files.createFile(path);
                System.out.println("创建文件: " + filePath);
            }
        } catch (IOException e) {
            System.err.println("无法创建文件: " + filePath);
            e.printStackTrace();
        }
    }

    /**
     * 用户注册方法
     * @param user 要注册的用户对象
     * @return 注册成功返回true，失败返回false
     */
    @Override
    public boolean register(User user) {
        // 检查手机号是否已存在
        if (getUserByPhone(user.getPhone()) != null) {
            return false;
        }

        try (BufferedWriter writer = new BufferedWriter(new FileWriter(USER_FILE_PATH, true))) {
            writer.write(user.toString());
            writer.newLine();
            return true;
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 更新用户信息
     * @param user 包含更新信息的用户对象
     * @return 更新成功返回true，失败返回false
     */
    @Override
    public boolean updateUser(User user) {
        List<User> users = readUsersFromFile();
        boolean found = false;

        // 查找并更新用户信息
        for (int i = 0; i < users.size(); i++) {
            if (users.get(i).getPhone().equals(user.getPhone())) {
                users.set(i, user);
                found = true;
                break;
            }
        }

        if (!found) return false;

        try (BufferedWriter writer = new BufferedWriter(new FileWriter(USER_FILE_PATH, false))) {
            // 重写文件以更新用户信息
            for (User u : users) {
                writer.write(u.toString());
                writer.newLine();
            }
            return true;
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 用户登录验证
     * @param phone 手机号
     * @param password 密码
     * @return 验证通过返回用户对象，否则返回null
     */
    @Override
    public User login(String phone, String password) {
        List<User> users = readUsersFromFile();
        for (User user : users) {
            if (user.getPhone().equals(phone) && user.getPassword().equals(password)) {
                return user;
            }
        }
        return null;
    }

    /**
     * 根据用户ID获取报告列表
     * @param userId 用户ID（手机号）
     * @return 该用户提交的报告列表
     */
    @Override
    public List<Report> getReportsByUserId(String userId) {
        List<Report> reports = new ArrayList<>();
        try (BufferedReader reader = new BufferedReader(new FileReader(REPORT_FILE_PATH))) {
            String line;
            while ((line = reader.readLine()) != null) {
                String[] parts = line.split(",");
                // 解析符合条件的报告记录
                if (parts.length >= 7 && parts[1].equals(userId)) {
                    Report report = new Report();
                    report.setReportId(parts[0]);
                    report.setUserId(parts[1]);
                    report.setUserName(parts[2]);
                    report.setAqiLevel(parts[3]);
                    report.setDescription(parts[4]);
                    report.setCreateTime(LocalDateTime.parse(parts[5]));
                    report.setGridAddr(parts[6]);
                    reports.add(report);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return reports;
    }

    /**
     * 提交环境报告
     * @param report 要提交的报告对象
     * @return 提交成功返回true，失败返回false
     */
    @Override
    public boolean submitReport(Report report) {
        // 生成唯一报告ID并设置当前时间
        report.setReportId(UUID.randomUUID().toString());
        report.setCreateTime(LocalDateTime.now());

        try (BufferedWriter writer = new BufferedWriter(new FileWriter(REPORT_FILE_PATH, true))) {
            // 按CSV格式写入报告数据
            writer.write(String.join(",",
                    report.getReportId(),
                    report.getUserId(),
                    report.getUserName(),
                    report.getAqiLevel(),
                    report.getDescription(),
                    report.getCreateTime().toString(),
                    report.getGridAddr()
            ));
            writer.newLine();
            return true;
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 从文件读取所有用户数据
     * @return 用户列表
     */
    private List<User> readUsersFromFile() {
        List<User> users = new ArrayList<>();
        try (BufferedReader reader = new BufferedReader(new FileReader(USER_FILE_PATH))) {
            String line;
            while ((line = reader.readLine()) != null) {
                User user = User.fromString(line);
                if (user != null) {
                    users.add(user);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return users;
    }

    /**
     * 验证用户凭证
     * @param phone 手机号
     * @param password 密码
     * @return 验证通过返回true，否则返回false
     */
    @Override
    public boolean validateUser(String phone, String password) {
        List<User> users = readUsersFromFile();
        for (User user : users) {
            if (user.getPhone().equals(phone) && user.getPassword().equals(password)) {
                return true;
            }
        }
        return false;
    }

    /**
     * 根据手机号获取用户信息
     * @param phone 手机号
     * @return 用户对象，未找到返回null
     */
    @Override
    public User getUserByPhone(String phone) {
        List<User> users = readUsersFromFile();
        for (User user : users) {
            if (user.getPhone().equals(phone)) {
                return user;
            }
        }
        return null;
    }
}